//! Make sure that a retag acts like a read for the data race model.
//! This is a retag/write race condition.
//!
//! This test is sensitive to the exact schedule so we disable preemption.
//@compile-flags: -Zmiri-tree-borrows -Zmiri-preemption-rate=0
#[derive(Copy, Clone)]
struct SendPtr(*mut u8);

unsafe impl Send for SendPtr {}

unsafe fn thread_1(SendPtr(p): SendPtr) {
    let _r = &*p;
}

unsafe fn thread_2(SendPtr(p): SendPtr) {
    *p = 5; //~ ERROR: Data race detected between (1) Read on thread `<unnamed>` and (2) Write on thread `<unnamed>`
}

fn main() {
    let mut x = 0;
    let p = std::ptr::addr_of_mut!(x);
    let p = SendPtr(p);

    let t1 = std::thread::spawn(move || unsafe { thread_1(p) });
    let t2 = std::thread::spawn(move || unsafe { thread_2(p) });
    let _ = t1.join();
    let _ = t2.join();
}
